Load a few packages and functions.
In [49]:
import pandas
pandas.options.display.max_rows = 12
import escher
from cameo import models, flux_variability_analysis, fba
First we load a model from the BiGG database (and make a copy of it).
In [50]:
model = models.bigg.e_coli_core.copy()
Calculate all flux ranges of all reactions in the model.
In [51]:
result = flux_variability_analysis(model)
Inspect the result.
In [52]:
result.data_frame
Out[52]:
Get an overview of a few key statistics of the resulting flux ranges.
In [53]:
result.data_frame.describe()
Out[53]:
Visualize the flux ranges.
In [54]:
result.plot(index=result.data_frame.index, height=1200)
Visualize the flux ranges on a pathway map of E. coli's central carbon metabolism.
In [55]:
abs_flux_ranges = abs(result.data_frame.lower_bound - result.data_frame.upper_bound).to_dict()
escher.Builder('e_coli_core.Core metabolism', reaction_data=abs_flux_ranges).display_in_notebook()
Out[55]:
Those reactions showing up in red are futile cyles.
In [56]:
result.data_frame[result.data_frame.upper_bound > 500]
Out[56]:
In [57]:
result_no_cyles = flux_variability_analysis(model, remove_cycles=True)
In [58]:
abs_flux_ranges = abs(result_no_cyles.data_frame.lower_bound - result_no_cyles.data_frame.upper_bound).to_dict()
escher.Builder('e_coli_core.Core metabolism', reaction_data=abs_flux_ranges).display_in_notebook()
Out[58]:
(Optimal) Flux Balance Analysis solutions are not necessariliy unique. Flux Variablity Analysis is a good tool for estimating the space of alternative optimal solutions.
In [13]:
fba(model)
Out[13]:
In [14]:
model_optimal = model.copy()
In [15]:
model_optimal.reactions.BIOMASS_Ecoli_core_w_GAM.lower_bound = 0.8739215069684299
In [16]:
result_max_obj = flux_variability_analysis(model_optimal, remove_cycles=True)
In [17]:
result_max_obj.plot(index=result_max_obj.data_frame.index, height=1200)
This is actually such a common task that flux_variability_analysis provides an option for fixing the objective's flux at a certain percentage.
In [19]:
result_max_obj = flux_variability_analysis(model, fraction_of_optimum=1., remove_cycles=True)
In [20]:
result_max_obj.plot(index=result_max_obj.data_frame.index, height=1200)
Turns out that in this small core metabolic model, the optimal solution is actually unique!
In [61]:
sum(abs(result_max_obj.data_frame.lower_bound - result_max_obj.data_frame.upper_bound))
Out[61]:
Explore how relaxing the constraint on the growth rate affects the solution space:
Using FVA, determine all blocked reactions ($v = 0$) in the model.
In [35]:
percentage = (0.7 / model.solve().f) * 100
percentage
Out[35]:
In [38]:
result_80perc_max_obj = flux_variability_analysis(model, fraction_of_optimum=percentage/100, remove_cycles=True)
In [39]:
result_80perc_max_obj.plot(index=result_80perc_max_obj.data_frame.index, height=1200)
In [40]:
flux_sums = []
optimum_percentages = range(50, 105, 5)
for i in optimum_percentages:
df = flux_variability_analysis(model, fraction_of_optimum=i/100, remove_cycles=True).data_frame
flux_sum = sum(abs(df.lower_bound - df.upper_bound))
print("{}%: ".format(i), flux_sum)
flux_sums.append(flux_sum)
In [41]:
import matplotlib.pyplot as plt
In [42]:
plt.plot(optimum_percentages, flux_sums)
plt.xlabel('Optimum (%)')
plt.ylabel('Flux sum [mmol gDW^-1 h^-1]')
plt.show()
In [44]:
result = flux_variability_analysis(model, remove_cycles=True)
In [48]:
result.data_frame[(result.data_frame.lower_bound == 0) & (result.data_frame.upper_bound == 0)]
Out[48]:
In [ ]: